#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>

//作业标题(1325)
//杨氏矩阵
//有一个数字矩阵，矩阵的每行从左到右是递增的，矩阵从上到下是递增的，
//请编写程序在这样的矩阵中查找某个数字是否存在。
//要求：时间复杂度小于O(N);
//1 2 3
//2 3 4
//3 4 5
//首先要先生成这样的矩阵，然后在矩阵中查找数字
//int main()
//{
//	int arr[10][10];
//	int i = 0;
//	int j = 0;
//	int line = 3;
//	int row = 3;
//	for (i = 0; i < line; i++)
//	{
//		for (j = 0; j < row; j++)
//		{
//
//			scanf("%d", &arr[i][j]);
//			if (0 == i && 0 == j)
//			{
//				continue;
//			}
//			//i=0的情况下,列的两项可以不用比较(也就是说，i=0的情况下，只比较行)
//			//j=0的情况下，行的两项可以不用比较(也就是说，j=0的情况下，只比较列)
//			else if (i == 0 && j > 0 && arr[0][j - 1] > arr[0][j])
//			{
//				break;
//			}
//			else if (j == 0 && i > 0 && arr[i-1][0] > arr[i][0])
//			{
//				break;
//			}
//			else if (arr[i - 1][j] > arr[i][j])//同列不同行
//			{
//				break;
//			}
//			else if (arr[i][j - 1] > arr[i][j])//同行不同列
//			{
//				break;
//			}
//		}
//	}
//
//
//return 0;
//}


//实现一个函数，可以左旋字符串中的k个字符。
//例如：
//ABCD左旋一个字符得到BCDA
//ABCD左旋两个字符得到CDAB
//字母向左移动，最左边的字母移动到右侧
//设计一个函数，函数有两个参数，一个用来传递字符串的首地址，
//一个用来传递需要移动字符的个数
//ABCD
//BCDA
//CDBA
//借助一个变量来过渡
//void spin(char* p,int shift_num,int sz)
//{
//	int temp = 0;
//	int i = 0;
//	int j = 0;
//	for (i=0;i<shift_num;i++)
//	{
//		temp = *p;
//		for (j = 0; j < sz; j++)
//		{
//			*(p + j) = *(p + j + 1);
//		}
//		*(p + sz-1) = temp;
//	}
//}
//int main()
//{
//	char string[10] = "0";
//	int shift_num = 3;
//	//scanf("%d", &shift_num);
//	gets(string);
//	int sz = strlen(string);
//	spin(string, shift_num,sz);
//	printf("%s",string);
//	return 0;
//}


//作业标题(1363)
//字符串旋转结果
//写一个函数，判断一个字符串是否为另外一个字符串旋转之后的字符串。
//例如：给定s1 = AABCD和s2 = BCDAA，返回1
//给定s1 = abcd和s2 = ACBD，返回0.
//AABCD左旋一个字符得到ABCDA
//AABCD左旋两个字符得到BCDAA
//AABCD右旋一个字符得到DAABC

//输入两个字符串，调用函数进行判断
//这个函数首先要能够和不同的左旋和右旋状态下的字符串进行比较
//除了左旋和右旋状态下的字符串外，其余的情况都不是正确的旋转结果
//int judge(char* p1, char* p2,int sz)
//{
//	//左旋和右旋
//	//每次旋转后和另一个字符串比较，如果相同，就直接返回1，
//	//不同就继续比较，全部比较完之后，都不相同，就返回0
//	int temp = 0;
//	int i = 0;
//	int j = 0;
//	int k = 0;
//
//	//左旋的所有可能
//	for (i = 0; i < sz; i++)
//	{
//		temp = *p1;
//		for (j = 0; j < sz; j++)
//		{
//			*(p1 + j) = *(p1 + j + 1);
//		}
//		*(p1 + sz - 1) = temp;//左旋一位的结果
//		//开始比较,
//		int flag = 0;
//		for (k=0;k<sz;k++)
//		{
//			if (*(p1 + k) == *(p2 + k))
//			{
//				flag++;
//				continue;
//			}
//			else
//			{
//				break;
//			}
//		}
//		if (flag == sz)
//		{
//			return 1;
//		}
//	}
//	//return 0;
//
//
//	//右旋的所有可能
//	//ABCDE
//	//EABCD
//	//DEABC
//	for (i = 0; i < sz; i++)
//	{
//		temp = *(p1+sz-1);
//		for (j = sz; j >0; j--)
//		{
//			*(p1 + j) = *(p1 + j -1);
//		}
//		*(p1) = temp;//左旋一位的结果
//		//开始比较,
//		int flag = 0;
//		for (k = 0; k < sz; k++)
//		{
//			if (*(p1 + k) == *(p2 + k))
//			{
//				flag++;
//				continue;
//			}
//			else
//			{
//				break;
//			}
//		}
//		if (flag == sz)
//		{
//			return 1;
//		}
//	}
//
//	return 0;
//}
//int main()
//{
//	char s1[10] = { "AABCD" };
//	char s2[10] = {"DAABC"};
//	int sz1 = strlen(s1);
//	int sz2 = strlen(s2);
//	if (sz1 != sz2)
//	{
//		printf("不是字符串的旋转结果");
//	}
//	int ret=judge(s1, s2,sz1);
//	if (1 == ret)
//	{
//		printf("是字符串的旋转结果");
//	}
//	else
//	{
//		printf("不是字符串的旋转结果");
//	}
//	return 0;
//}


//函数指针数组：是一个数组，它里面存放的是函数指针
//它可以由函数指针去进行记忆
//void (*pf)(int,int)=&Add;
//void (*pf[10])(int,int);去掉pf[10]以后剩下void (*)(int ,int)
//就是函数指针数组的类型

int Add(int x, int y)
{
	return x + y;
}

int Sub(int x, int y)
{
	return x - y;
}

int Mul(int x, int y)
{
	return x * y;
}

int Div(int x, int y)
{
	return x / y;
}

void menu()
{
	printf("***1.add  2.sub***\n");
	printf("***3.mul  4.div***\n");
	printf("***0.exit***\n");
	printf("********************\n");
}
int main()
{
	int input = 0;
	int x = 0;
	int y = 0;
	int ret = 0;
	int (*pf[5])(int, int) = {NULL,&Add,&Sub,&Mul,&Div};
	do
	{
		menu();
		printf("请选择运算>:\n");
		scanf("%d",&input);

		if (input == 0)
		{
			printf("退出计算器");
			//break;
		}
		else if (input >= 1 && input <= 4)
		{
			printf("请输入两个操作数>:\n");
			scanf("%d %d", &x, &y);
			ret = pf[input](x, y);//调用函数指针数组
			printf("%d\n", ret);
		}
		else
		{
			printf("输入错误，请重新输入");
			//break;
		}

		
	} while (input);
	return 0;
}